	
	var gulp = require('gulp');
	var	less = require('gulp-less'); // less编译
	var	browserSync = require('browser-sync').create(); // 服务器
	var reload = browserSync.reload;  // 页面自动刷新
	var notify = require('gulp-notify');  // 提示
	var concat = require('gulp-concat');  // 合并
	var cleancss = require('gulp-clean-css');  // css压缩
	var rev = require('gulp-rev');  // 版本控制（清缓存）
	var revCollector = require('gulp-rev-collector'); // 路径映射
	var runSequence = require('run-sequence'); // 同步异步处理（解决node异步执行造成的文件错乱）
	var del = require('del'); //删除
	var vinylPaths = require('vinyl-paths');  //管道删除
	var base64 = require("gulp-base64"); // base64
	var fs = require('fs');  // Node的文件模块
	var imagemin = require('gulp-imagemin'); // 图片压缩
	var spriter = require('gulp-css-spriter'); // 雪碧图（只支持jpg和png）
	var babel = require('gulp-babel'); // js编译 （依赖于babel-core模块，需要安装babel-preset-es2015模块）
	var uglify = require('gulp-uglify'); // js压缩
	var rename = require('gulp-rename'); // 重命名
	var changed = require('gulp-changed'); // 筛选被改变了的文件
	
	var src = {
		"css": "src/css/",
		"img": "src/img/",
		"js": "src/js/",
		"less": "src/less/"
	}
	var build = {
		"css": "build/css/",
		"img": "build/img/",
		"js": "build/js/"
	}
	
	// 删除文件夹
	gulp.task('del', function(){
		del(['./build/*','./rev'])
	});
	
	// 图片移动
	gulp.task('img',function(){
		gulp.src('src/img/*.*')
			.pipe(imagemin())  // 压缩（压缩过的压缩不了）
			.pipe(gulp.dest('build/img'))
	});
	
	// css处理
	gulp.task('css',function(){
		// less编译
		gulp.src('src/less/*.less')
			.pipe(less())
			.pipe(gulp.dest('src/css'))
			.pipe(reload({stream:true}))  // 反馈给服务器已完成任务
			.pipe(notify("完成了 less --> css [<%= file.relative %>]")) // 提示（相当于一个注释）
		
		gulp.src('./src/css/*.css')
			.pipe(concat('index.css')) // 合并
			
			.pipe(spriter({
				'spriteSheet': './build/img/spritesheet.png', // 雪碧图存放位置
				'pathToSpriteSheetFromCSS': '../img/spritesheet.png'  // 更改css引用的url
			}))
			
			.pipe(base64({  // base64
				maxImageSize: 8*1024,  // 8kb以下的执行
				debug: true
			 }))
			 
			.pipe(cleancss())  // css压缩
			.pipe(rev())  // 版本控制（避免浏览器缓存）
			.pipe(gulp.dest('./build/css'))
			
			.pipe(rev.manifest())  // 生成一个rev-manifest.json 保存css文件名的映射
			.pipe(gulp.dest('./rev')) // 保存rev-manifest.json的文件夹
			
			.pipe(reload({stream:true}))
			.pipe(notify("css合并完成 [<%= file.relative %>]"))
	});
	
	// js处理
	gulp.task('js',function(){
		gulp.src(['./src/js/es6.js','./src/js/es7.js'])
			.pipe(concat('index.js'))  // 合并
			.pipe(gulp.dest('./src/js'))
		gulp.src('./src/js/index.js')
			.pipe(babel({
				presets: ['es2015']  // 编译为ES5
			 })) 
			.pipe(uglify())  // js压缩
			//.pipe(rename('./index.min.js')) // 重命名（这个./代表的是源文件所在的文件夹）
			.pipe(gulp.dest('./build/js'))
	})
	
	// 路径映射
	gulp.task('html',function(){
		// 异步执行的关系，在指定文件生成之前，一直判断执行
		fs.exists('./rev/rev-manifest.json',function(flag){
			if(flag){
				gulp.src(['./rev/*.json','./src/*.html'])  // 将映射反映到HTML文件中并生成映射后的新文件
					.pipe(changed('./src/*.html')) // 筛选被修改了的文件
					.pipe(revCollector())
					.pipe(gulp.dest('./build'))
			} else {
				runSequence('html'); 
			}
		});
	});
	
	// 静态服务器
	gulp.task('default', function(){  // 注入less，开启服务器即执行任务
		
		// gulp.src('./rev').pipe(vinylPaths(del)) // 流管道删除
		
		runSequence('img','css','js','html') // 不完全同步执行，数组内的异步执行
		
		browserSync.init({
			server: {
				baseDir: './build/'  // 根目录
			},
			port: 12138
		});
		
		gulp.watch('src/less/*.less', ['img','css','html']); // 监听文件改变，执行一些任务
		gulp.watch('src/!(_)*.html', ['html']); // !(_)* 正则表达式
	});
	
	
	
	
